package Framework.Intermediarios;

import Framework.Fabricas.FabricaConexion;
import Framework.Fabricas.FabricaUUID;
import Framework.Fachadas.FachadaPersistenciaInterna;
import Framework.Utilidades.Agente;
import Framework.Utilidades.Criterio;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

public abstract class IntermediarioPersistenciaRelacional extends
		IntermediarioPersistencia {

	@Override
	public ArrayList MaterializarCriterio(Criterio criterios) {
		try {
			String sql = ArmarConsultaSQLSelectCriterio(criterios); 

			Connection con = FabricaConexion.getInstancia().getConexion();

			PreparedStatement statement = con.prepareStatement(sql);
			ResultSet resultSet = statement.executeQuery();
			

			ArrayList agente = ConvertirRegistroAObjeto(resultSet); 
			return agente;
		} catch (SQLException ex) {
			Logger.getLogger(
					IntermediarioPersistenciaRelacional.class.getName()).log(
					Level.SEVERE, null, ex);
			return null;
		}
	}

	@Override
	public Object MaterializarOID(String oid) {
		try {
			String sql = ArmarConsultaSQLSelectOID(oid);
			
			Connection con = FabricaConexion.getInstancia().getConexion();
			// ResultSet resultSet =
			// FachadaPersistenciaInterna.getInstancia().conexion.createStatement().executeQuery(sql);

			PreparedStatement statement = con.prepareStatement(sql);
			
			
			ResultSet resultSet = statement.executeQuery();
	
			ArrayList agente = ConvertirRegistroAObjeto(resultSet);
			Object agenteResultado = agente.get(0);
			return agenteResultado;
		} catch (SQLException ex) {
			Logger.getLogger(
					IntermediarioPersistenciaRelacional.class.getName()).log(
					Level.SEVERE, null, ex);
			return null;
		}
	}

	@Override
	public void DesmaterializarGuardar(Object objeto) {
		try {
			if (((Agente) objeto).getEsNuevo() == true) {
				String oid = FabricaUUID.getInstancia().getOID();
				((Agente) objeto).setOID(oid);
				String sql = ArmarConsultaSQLInsert(objeto);
		
				Connection con = FabricaConexion.getInstancia().getConexion();
		
				PreparedStatement statement = con.prepareStatement(sql);
				statement.executeUpdate();
				
				System.out.println("El objeto fue ingresado a la base de datos exitosamente");

				// FachadaPersistenciaInterna.getInstancia().conexion.createStatement().executeQuery(sql);

				// PreparedStatement statement = con.prepareStatement(sql);

				// INSERT INTO Estudiante (OIDEstudiante, nombre, apellido, dni,
				// estado, localidad, tipoLegajo, numeroLegajo) VALUES
				// ('6dda7309-b34c-430e-a799-6001acb321ec', 'Mariana',
				// 'Lapenna', '32548789', 'regular', 'Villa Nueva, Guaymallen',
				// 'utn sistemas', '31758')
				// statement.executeQuery();

			} else {
				String sql = ArmarConsultaSQLUpdate(objeto);
				
				Connection con = FabricaConexion.getInstancia().getConexion();
			

				PreparedStatement statement = con.prepareStatement(sql);
				statement.executeUpdate();
				
				System.out.println("El estudiante fue modificado en la base de datos exitosamente");
				
				
				
			}
		} catch (SQLException ex) {
			Logger.getLogger(
					IntermediarioPersistenciaRelacional.class.getName()).log(
					Level.SEVERE, null, ex);
		}
	}

	public abstract String ArmarConsultaSQLSelectOID(String oid);

	public abstract String ArmarConsultaSQLSelectCriterio(Criterio criterios);

	public abstract String ArmarConsultaSQLInsert(Object objeto);

	public abstract String ArmarConsultaSQLUpdate(Object objeto);

	public abstract String ArmarConsultaSQLDelete(Object objeto);

	public abstract ArrayList BuscarObjetosRelacionados(Criterio criterios);

	public abstract Object CompletarObjeto(String oid, String clase);

	public abstract ArrayList ConvertirRegistroAObjeto(ResultSet resultSet);

	public abstract void GuardarObjetosRelacionados(ArrayList objeto);
}